package DisciplinaTopico;

import Questao.Dificuldade;
import Questao.Questao;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.UUID;

public class Topico
{
    private List<Questao> questoes = new ArrayList<Questao>();
    List<Questao> questoesSelecionadas = new ArrayList<Questao>();
    
    private String ID;
    private String topico;
    private int aleatorio;
    private int seed = 0;
    private Random r;

    public Topico()
    {
    }

    public Topico(String topico, List<Questao> questoes)
    {
         this.ID = UUID.randomUUID().toString();
         this.topico = topico;
         this.questoes = questoes;
    }

    public String getID()
    {
        return ID;
    }

    public void setID(String ID)
    {
        this.ID = ID;
    }

    public String getTopico()
    {
        return topico;
    }

    public void setTopico(String topico)
    {
        this.topico = topico;
    }

    
    public List<Questao> getQuestoes()
    {
        return questoes;
    }

    public void setQuestoes(List<Questao> questoes)
    {
        this.questoes = questoes;
    }

    @Override
    public boolean equals(Object outroTopico)
    {
        if (outroTopico == null)
            return false;

        Topico t = (Topico)outroTopico;

        if (t == this)
            return true;

        return (this.topico.equalsIgnoreCase(t.topico));
     }

     /*
     * Override do método 'toString' para que o componente da view mostre apenas
     * o tópico
     */
    @Override
    public String toString()
    {
        return topico;
    }

    private List<Questao> obtemQuestaoAdequada(Dificuldade nivel, String tipo){
        List<Questao> questoesAdequadas = new ArrayList<Questao>();
        for (Questao q: questoes)
        {
            if ((q.getDificuldade().equals(nivel)) && (q.getTipoQuestao().equals(tipo)) && (!questoesAdequadas.contains(q) ) )
            {
                questoesAdequadas.add(q);
            }
        }
        return questoesAdequadas;
    }

    public Questao getQuestao(Dificuldade nivel, String tipo)
    {
        List<Questao> questoesAdequadas = obtemQuestaoAdequada(nivel, tipo);
        
        if (questoesAdequadas.size()>0)
        {
            for (Questao possivelQuestao: questoesAdequadas )
            {
                possivelQuestao = questoesAdequadas.get(getNumeroAleatorioQuestao(questoesAdequadas.size()));
                if (!questoesSelecionadas.contains(possivelQuestao))
                {
                    questoesSelecionadas.add(possivelQuestao);
                    return possivelQuestao;
                }
            }
        }
        return null;
    }

    private int getNumeroAleatorioQuestao(int numQuestoesAdequadas)
    {
        if (numQuestoesAdequadas>0)
        {
            r = new Random(System.currentTimeMillis() + seed++);
            aleatorio =0+ r.nextInt(numQuestoesAdequadas);
            return aleatorio;
        }
        return 0;
    }

    public void limpaQuestoesSelecionadas(){
        questoesSelecionadas.clear();
    }

}
